package p02_queue;

/**
 *
 */
public class CircleArrayQueue {
    private int maxSize;

    // front变量的含义做一个调整：front就指向队列的第一个元素，也就是说arr[front]就是队列的第一个元素 front的初始值=0
    private int front;
    // rear变量的含义做一个调整：rear指向队列的最后一个元素的后一个位置，因为希望空出一个空间做为约定. rear的初始值=0
    private int rear;
    private int[] arr;

    public CircleArrayQueue(int maxSize) {
        this.maxSize = maxSize + 1;
        this.front = 0;
        this.rear = 0;
        this.arr = new int[this.maxSize];
    }

    /**
     * 判断队列是否满了。
     *
     * @return
     */
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    /**
     * 判断队列是否为空。
     *
     * @return
     */
    public boolean isEmpty() {
        return rear == front;
    }

    /**
     * 向队列添加元素
     *
     * @param n 待添加的元素
     */
    public void add(int n) {
        if (isFull()) {
            System.out.println("队列已满！");
        } else {
            arr[rear] = n;
            rear = (rear + 1) % maxSize;
        }
    }

    /**
     * 从队列中获取元素
     *
     * @return
     */
    public int get() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空！");
        } else {
            int value = arr[front];
            front = (front + 1) % maxSize;
            return value;
        }
    }

    /**
     * 将整个队列打印到console。
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("队列为空！");
        } else {
            for (int i = front; i < front + size(); i++) {
                System.out.printf("[%d] : %d\n", i - front, arr[i % maxSize]);
            }
        }
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空！");
        } else {
            return arr[front + 1];
        }
    }

    public int size() {
        return (rear + maxSize - front) % maxSize;
    }
}
